//
//  HMHomeViewModel.swift
//  Weibo24
//
//  Created by apple on 17/3/30.
//  Copyright © 2017年 itheima. All rights reserved.
//

import UIKit
import SDWebImage

//  封装首页数据的网络请求
class HMHomeViewModel: NSObject {
    //  数据源
    lazy var statusList: [HMStatusViewModel] = [HMStatusViewModel]()
    
    //  获取首页数据
    func requestHomeData(isPullup: Bool, callBack: @escaping (Bool, String)->()) {
        //  默认的上拉加载的微博id
        var maxId: Int64 = 0
        //  默认的下拉刷新的微博id
        var sinceId: Int64 = 0
        if isPullup {
            //  如果是上拉加载获取数组的最后一个元素的微博id,去加载更多的微博数据
            maxId = statusList.last?.status?.id ?? 0
            //  解决数据重复问题
            if maxId > 0 {
                maxId -= 1
            }
        } else {
            //  下拉刷新
            sinceId = statusList.first?.status?.id ?? 0
        }
      
        
        var message = "没有加载到最新的微博数据"
        
        HMStatusDAL.checkCacheData(maxId: maxId, sinceId: sinceId) { (statusDicArray) in
            
            //  数组字典转成数组模型
            //  1. classForCoder 如果能够获取对象的类型,那么这个对象必须有父类最终继承是NSObject
            //  2. self swift 的使用获取对象的类型的方式,这个类可以没有父类
            let statusArray = NSArray.yy_modelArray(with: HMStatus.self, json: statusDicArray) as! [HMStatus]
            
            var tempArray: [HMStatusViewModel] = [HMStatusViewModel]()
            //  创建调度组
            let group = DispatchGroup()
            //  遍历数组模型转成对应数组ViewModel类型
            for status in statusArray {
                let statusViewModel = HMStatusViewModel()
                //  关联微博模型数据
                statusViewModel.status = status
                //  添加到指定数组
                tempArray.append(statusViewModel)
                
                //  1. 判断原创微博和转发微博是否有单张图片
                if status.pic_urls?.count == 1 {
                    // 获取单张图片的地址
                    let imageURL = status.pic_urls?.first?.thumbnail_pic
                    //  原创微博有单张图片
                    //  加入到调度组
                    group.enter()
                    SDWebImageManager.shared().loadImage(with: URL(string: imageURL!), options: [], progress: nil, completed: { (image, data, error, _, _, _) in
                        //  image, data, error 
                        /*
                            1. image : 表示下载的图片
                            2. data  : 表示下载图片的二进制
                            3. error : 表示下载的错误信息
                         */
                        print("原创微博单张图片下载完成")
                        //  离开调度组
                        group.leave()
                    })
                }
                
                if status.retweeted_status?.pic_urls?.count == 1 {
                   
                    // 获取单张图片的地址
                    let imageURL = status.retweeted_status?.pic_urls?.first?.thumbnail_pic
                    //  转发微博有单张图片
                    //  加入到调度组
                    group.enter()
                    SDWebImageManager.shared().loadImage(with: URL(string: imageURL!), options: [], progress: nil, completed: { (image, data, error, _, _, _) in
                        //  image, data, error
                        /*
                         1. image : 表示下载的图片
                         2. data  : 表示下载图片的二进制
                         3. error : 表示下载的错误信息
                         */
                        print("转发微博单张图片下载完成")
                        //  离开调度组
                        group.leave()
                    })
                }
                
                
            }
            
            //  保存数据源
//            self.statusList = tempArray
            if isPullup {
                //  上拉加载, 追加了加载的更多的微博数据
                self.statusList.append(contentsOf: tempArray)
            } else {
                //  下拉刷新, 需要把请求回来的数据插入的第一个元素的位置
                self.statusList.insert(contentsOf: tempArray, at: 0)
            }
            
            if tempArray.count > 0 {
                message = "加载了\(tempArray.count)条微博数据"
            }
            
            //  调度组里面的任务都执行完成以后会回调这个闭包
            group.notify(queue: DispatchQueue.main, execute: { 
                //  让tableView重新加载数据
                print("所有的单张图片都现在完成了")
                callBack(true, message)
            })
            
        }
    }
    
}
